// generator  返回一个迭代器

function *read(){
  let a = 1
  console.log(a)
  yield 1;
  yield 2;
  let bb = (yield 3) + 2;
  console.log(bb); 
  return 4;
}

let it = read()
console.log(it.next()) // { value: 1, done: false }  done 是否结束
console.log(it.next(2))
console.log(it.next(6))
console.log(it.next(7))

// next 方法的参数  会作为 上一个 yield 的 返回值



// ... 或者 for of 必须给对象提供一个迭代器
let obj = {0:1, 1: 2, length:2, 
  [Symbol.iterator]: function *(){
    // for(let key in this) {   // [ 1, 2, 2 ]
    //   yield this[key]
    // } // 这样写length 会被算进去  
    let index = 0
    while(index !== this.length){
      yield this[index++]
    }
  }
  // [Symbol.iterator]() {
  // // 迭代器 是有next 方法 而且方法执行后 需要返回  value done
  // // 
  // let len = this.length
  // let index = 0;
  // return {
  //   next: () => {
      
  //     return {value: this[index++], done: index == len}  // [1]  done 等于true 的时候value 不会在数组中
  //   }
  // }
  //}
}
let arr = [...obj]
console.log(arr)